// TS函数定义
function greet(): string {
  // 返回值是字符串
  return 'helle TS'
}

function caller() {
  var msg = greet() // 调用greet()函数
  console.log('msg:', msg)
}

// 调用caller函数
caller()
console.log('------------------------')

// 带参数函数
// 参数 x 为number类型 y 为number类型 函数返回值为number类型
function add(x: number, y: number): number {
  return x + y
}
console.log(add(1, 2))
console.log('------------------------')

// 可选参数
// 在 TypeScript 函数里，如果我们定义了参数，则我们必须传入这些参数，除非将这些参数设置为可选，可选参数使用问号标识 ？
function buildName(firstName: string, lastName: string) {
  return firstName + ' ' + lastName
}

// let result1 = buildName('Bob') // 错误，缺少参数
// let result2 = buildName('Bob', 'Adams', 'Sr.') // 错误，参数太多了
let result3 = buildName('Bob', 'Adams') // 正确

// 改造bulidName函数中的参数为‘可选参数’
// lastName?: string 这个参数为可以选的，可传 可不传
function buildName2(firstName: string, lastName?: string) {
  return firstName + ' ' + lastName
}
let res1 = buildName2('Bob') // 正确
// let res2 = buildName2("Bob", "Adams", "Sr.");  // 错误，参数太多了
let res3 = buildName2('Bob', 'Adams') // 正确

// 默认参数
function plusNum(x: number, y: number = 5): number {
  return x + y
}
console.log(plusNum(1)) // 1+5
console.log(plusNum(1, 10)) // 1+10
console.log('------------------------')

// 剩余函数
// 应用于我们不知道要传入多少个参数
// string[] 为string类型的数组
function arrListName(fristName: string, ...otherName: string[]) {
  return fristName + ' ' + otherName.join(' ')
}
let resArr = arrListName('A', 'B', 'C')
console.log('resArr:', resArr)
console.log('------------------------')

// 匿名函数
let msg = function () {
  return 'helle typescript'
}
console.log(msg())
console.log('------------------------')

// 带参数匿名函数
const test = function (a: number, b: number) {
  return a * b
}
console.log(test(12, 2))
console.log('------------------------')
